#include<iostream>
using namespace std;
int n, m;
const int N = 110, M = 10010;
int f[N][M];
int a[N];
int main()
{
	cin >> n >> m;
	for (int i = 1;i <= n;i++)
	{
		cin >> a[i];
	}
	//这道题目里面非法的格子就让他是0就可以。因为这里面的状态标识的是方案数。如果有不满足的方案就让他是0也没关系，使用他的时候他不起作用。
	f[0][0] = 1;//不进行初始化后面的数就都是0
	for (int i = 1;i <= n;i++)
	{
		for (int j = 0;j <= m;j++)
		{
			//f状态表示的是花费为m的在前i个菜中选的方案数
			f[i][j] = f[i - 1][j];
			if (j >= a[i]) f[i][j] = f[i][j]+ f[i - 1][j - a[i]];//注意这里是方案数所以没有价值可加
		}
	}
	cout << f[n][m] << endl;
	return 0;
}